#include "trap.h"
   .set noat                # 禁止使用保留寄存器$at
   .globl main
   .text

main: 
    # 初始化常数寄存器
    addi    $t2, $zero, 0x4       # $t2 = 4
    addi    $t3, $zero, 0x3000    # $t3 = 0x3000

    # 加载高位值到$t0和$t1寄存器
    lui     $t0, 0x7FFF           # $t0 = 0x7FFF0000
    lui     $t1, 0x8100           # $t1 = 0x81000000
    lui     $s1, 0x7FFF           # $s1 = 0x7FFF0000

    # 插入NOP指令以模拟流水线延迟
    nop                          
    nop
    nop

    # 构造$s1为最大正整数
    ori     $s1, $s1, 0xFFFF      # $s1 = 0x7FFFFFFF

    # 调整$t0和$t1以构造特定值
    addi    $t0, $t0, 0x7FFF      # $t0 = 0x7FFF7FFF
    addi    $t1, $t1, 0x8000      # $t1 = 0x80FF8000

    # 插入额外的NOP指令
    nop
    nop
    nop

    # 执行带溢出的加法测试
    addiu   $s3, $t1, 0x8000      # 负溢出: $s3 = 0x80FF0000
    addiu   $s2, $s1, 0x2         # 正溢出: $s2 = 0x80000001

    # 比较指令测试
    slti    $s4, $t1, 0xFF        # 小于符号立即数
    sltiu   $s5, $t1, 0xFF        # 小于无符号立即数
    slti    $s6, $s1, 0xFF        # 符号比较
    sltiu   $s7, $s1, 0xFF        # 无符号比较

    # 按位与和异或测试
    andi    $t2, $t0, 0x8000      # $t2 = $t0 & 0x8000
    andi    $t3, $t1, 0x1000      # $t3 = $t1 & 0x1000
    xori    $t4, $s0, 0x8         # $t4 = $s0 ^ 0x8
    xori    $t5, $s1, 0x0         # $t5 = $s1 ^ 0x0

    # 初始化新的常数值
    addi    $t0, $zero, 0x3       # $t0 = 3
    addi    $t1, $zero, 0x4       # $t1 = 4

    # 程序结束，触发模拟器停止
    HIT_GOOD_TRAP                 # 停止模拟器